1330754 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

さすらいのプログラマ

さすらいのプログラマ

hex2char

16進のダンプデータを元の文字列に戻すのが、欲しくてlispで作ってみました。

改良の余地はいっぱいあるし、エラー処理もしていないけど、こんなものがサッと作れればいいな。(C言語とかでは、作れるけど・・・)

こんな16進のテキストデータ


8d878c762033320a2d727778722d7872
2d78202020312073797374656d202020
73797374656d20202020202020203530
204f63742032322032323a3130206765
74646174612e6b73680a2d72772d722d
2d722d2d202020312073797374656d20
202073797374656d2020202020203133
3332204f63742032322032323a333720
676574646174612e6c6f670a2d72772d
722d2d722d2d20202031207379737465
6d20202073797374656d202020202020
31313638204f63742032322032323a30
3920676574646174612e6c6f670d0a2d
72772d722d2d2d2d2d20202031207379
7374656d20202073797374656d202020
20202020353039204f63742032322032
323a313020676574646174612e73716c
0a00


で、作ったlisp


;
;hex2char
;
;カーソルのある場所から行末まで16進文字列を変換し、
;次の行へ挿入します。(1バイト文字のみ対応なので漢字は
;できません)
;
;2007/10/23 作成
;
(defun hex2char()
 &nps;(interactive)
  (let ((src-point)
        (end-point)
        (dst-point)
        (target-char)
        (converted-char))
    (setq src-point (point))
    (goto-eol)
    (setq end-point (point))
    (goto-char (+ end-point 1))
    (while (< src-point end-point)
      (setq target-char (buffer-substring src-point (+ src-point 2)))
      (setq converted-char (code-char (convert_hex target-char)))
      (if (graphic-char-p converted-char)
          (insert converted-char " ")
        (progn
          (insert target-char)
          (set-text-color (- (point) 3) (point) 1 7)))
      (setq src-point (+ src-point 2)))
    (insert #\LFD)))

;
;convert_hex
;
;16進文字列を値に変換します。
;(エラーチェックはまだ入れていません)
;
;2007/10/23 作成
;
(defun convert_hex(x)
  (let ((clist "0123456789ABCDEF")
        (v 0)
        (i 0)
        (j) (citem))
    (while (< i (length x))
      (setq citem (substring x i (+ i 1)))
      (setq j 0)
      (while (< j (length clist))
        (if (string-equal citem (substring clist j (+ j 1)))
            (progn
             (setq v (+ (* v 16) j))
             (return)))
        (setq j (+ j 1)))
     ;;; error処理していない
      (setq i (+ i 1))
      )
    v))

;hex2char-buffer
;
;マークした個所からカレント行までを変換する
;

(defun hex2char-buffer()
  (interactive)
  (let ((last-line (current-line-number))
        (first-line)
        (loop-cnt))
    (goto-char (mark))
    (setq first-line (current-line-number))
    (if (<= first-line last-line)
        (progn
          (setq loop-cnt (+ (- last-line first-line) 1))
          (dotimes (i loop-cnt)
            (hex2char))))))


変換をしたい先頭をマークし、変換対象の終わりの行までカーソル移動後、
hex2char-bufferとやるといかのようになります。


8d878c762033320a2d727778722d7872
8d878cv 3 2 0a- r w x r - x r
2d78202020312073797374656d202020
- x 1 s y s t e m
73797374656d20202020202020203530
s y s t e m 5 0
204f63742032322032323a3130206765
O c t 2 2 2 2 : 1 0 g e
74646174612e6b73680a2d72772d722d
t d a t a . k s h 0a- r w - r -
2d722d2d202020312073797374656d20
- r - - 1 s y s t e m
202073797374656d2020202020203133
s y s t e m 1 3
3332204f63742032322032323a333720
3 2 O c t 2 2 2 2 : 3 7
676574646174612e6c6f670a2d72772d
g e t d a t a . l o g 0a- r w -
722d2d722d2d20202031207379737465
r - - r - - 1 s y s t e
6d20202073797374656d202020202020
m s y s t e m
31313638204f63742032322032323a30
1 1 6 8 O c t 2 2 2 2 : 0
3920676574646174612e6c6f670d0a2d
9 g e t d a t a . l o g 0d0a-
72772d722d2d2d2d2d20202031207379
r w - r - - - - - 1 s y
7374656d20202073797374656d202020
s t e m s y s t e m
20202020353039204f63742032322032
5 0 9 O c t 2 2 2
323a313020676574646174612e73716c
2 : 1 0 g e t d a t a . s q l
0a00
0a00


ほとんど初心者レベルなので直しがいるけど・・・(^^;


© Rakuten Group, Inc.